import cv2
import pytesseract
from PIL import Image

# 设置 Tesseract 的可执行文件路径
# pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"


def process_gray_image(image_path: str) -> Image.Image:
    img = cv2.imread(image_path)
    if img is None:
        raise FileNotFoundError(f"无法使用OpenCV读取图片: {image_path}")

    # 转换为灰度图并进行二值化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 使用Otsu's方法自动寻找最佳阈值
    _, binary = cv2.threshold(gray, 170, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

    # 将处理后的图像从OpenCV格式转换为Pillow格式
    processed_image = Image.fromarray(cv2.cvtColor(binary, cv2.COLOR_GRAY2RGB))
    return processed_image


def extract_text_from_image(
    image_path: str,
    lang: str = "chi_sim",
    enable_preprocessing: bool = False,
    use_super_resolution: bool = False,
) -> str:
    """
    从单张图片中提取文字。

    Args:
        image_path (str): 图片文件的路径。
        lang (str): Tesseract OCR 使用的语言。默认为 'chi_sim' (简体中文)。
        enable_preprocessing (bool): 是否启用图像预处理。
        use_super_resolution (bool): 是否在预处理中使用超分辨率。

    Returns:
        str: 提取出的文字。
    """
    try:
        if enable_preprocessing:
            print("正在进行图像预处理...")
            image_to_process = process_gray_image(image_path)
        else:
            image_to_process = Image.open(image_path)

        # 使用 Tesseract 进行 OCR 识别
        # --oem 3: 使用基于 LSTM 的识别引擎
        # --psm 6: 假设为统一的文本块
        custom_config = r"--oem 3 --psm 6"
        text = pytesseract.image_to_string(
            image_to_process, lang=lang, config=custom_config
        )

        return text.strip()

    except FileNotFoundError as e:
        return f"错误: 文件未找到 - {e}"
    except pytesseract.TesseractNotFoundError:
        return "错误: Tesseract 未安装或未在系统PATH中。请访问 https://github.com/tesseract-ocr/tesseract 并按照说明进行安装。"
    except Exception as e:
        return f"错误: 使用 Tesseract 提取文字时发生错误: {e}"
